#pragma once

#include <iostream>
#include <string>
#include <ctemplate/template.h>

// #include "oj_model.hpp"
#include "oj_model2.hpp"

namespace ns_view{

    using namespace ns_model;

    const std::string template_path = "./template_html/";//定义模板路径

    class View{
        public:
        View(){}
        ~View(){}

        public:
        //引用了一个名为questions的向量（vector），该向量存储的元素类型为struct Question的实例
        //引用了一个包含Question结构体的向量的集合
        void AllExpandHtml(const vector<struct Question> &questions, std::string *html){
            // 题目的编号 题目的标题 题目的难度
            // 推荐使用表格显示
            // 1. 形成路径
            std::string src_html = template_path + "all_questions.html";//源html
            // 2. 形成数字典
            //这行代码创建了一个名为 root 的 ctemplate::TemplateDictionary 对象，并将其标识符（或名称）设置为 "all_questions"
            ctemplate::TemplateDictionary root("all_questions");
            //all_questions 只是一个标识符或名称，它本身并不包含任何逻辑或功能
            //它的作用完全取决于它是如何被定义、使用以及它所关联的 TemplateDictionary 对象中存储了哪些数据

            for (const auto& q : questions)
            {
                //创建了一个名为question_list的分区字典（sub），并将其作为root字典的一个部分
                ctemplate::TemplateDictionary *sub = root.AddSectionDictionary("question_list");//添加部分数字典
                //它在模板的question_list部分设置了问题的编号、标题和星级
                sub->SetValue("number", q.number);
                sub->SetValue("title", q.title);
                sub->SetValue("star", q.star);
            }

            //CTemplate 是一个简单实用、功能强大的文字模板库，设计哲学是轻量级、快速，并且强调逻辑和界面的分离。
            //Template 类封装了模板文件的内容和处理逻辑，允许开发者通过编程方式加载模板文件，并使用数据字典（TemplateDictionary）来填充模板中的变量和片断，
            //最终生成所需的输出内容（如 HTML 页面、电子邮件正文等）
            //3. 获取被渲染的html
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);

            //4. 开始完成渲染功能
            tpl->Expand(html, &root);
        }

        void OneExpandHtml(const struct Question &q, std::string *html){
            // 1. 形成路径
            std::string src_html = template_path + "one_question.html";

            // 2. 形成数字典
            ctemplate::TemplateDictionary root("one_question");
            root.SetValue("number", q.number);
            root.SetValue("title", q.title);
            root.SetValue("star", q.star);
            root.SetValue("desc", q.desc);
            root.SetValue("pre_code", q.header);

            //3. 获取被渲染的html
            ctemplate::Template *tpl = ctemplate::Template::GetTemplate(src_html, ctemplate::DO_NOT_STRIP);
           
            //4. 开始完成渲染功能
            tpl->Expand(html, &root);
        }
    }
}